package config

import (
	"encoding/json"
	"io/ioutil"
	"os"
	"path/filepath"
	"sync"
)

var globalConfig *Config

var configOnce   sync.Once

// LoadConfig 加载所有配置文件
func LoadConfig(configDir string) (*Config, error) {
	var err error
	configOnce.Do(func() {
		globalConfig = NewConfig()
		// 加载server配置
		if err = loadConfigFile(filepath.Join(configDir, "server.json"), globalConfig); err != nil {
			return
		}
		// 加载database配置
		if err = loadConfigFile(filepath.Join(configDir, "database.json"), &globalConfig.DataBase); err != nil {
			return
		}
		// 加载http配置
		if err = loadConfigFile(filepath.Join(configDir, "http.json"), &globalConfig.Http); err != nil {
			return
		}
		// 加载master配置
		if err = loadConfigFile(filepath.Join(configDir, "master.json"), &globalConfig.Master); err != nil {
			return
		}
		// 可以在这里添加环境变量覆盖逻辑
		overrideFromEnv(globalConfig)
	})
	
	return globalConfig, err
}

func loadConfigFile(path string, out interface{}) error {
	if _, err := os.Stat(path); os.IsNotExist(err) {
		return nil // 配置文件不存在则使用默认值
	}
	data, err := ioutil.ReadFile(path)
	if err != nil {
		return err
	}
	return json.Unmarshal(data, out)
}

// 从环境变量覆盖配置
func overrideFromEnv(cfg *Config) {
	// 示例：如果设置了DB_PASSWORD环境变量，则覆盖数据库密码
	if dbPass := os.Getenv("DB_PASSWORD"); dbPass != "" {
		cfg.DataBase.Password = dbPass
	}
	// 可以添加更多环境变量覆盖逻辑...
}

// GetConfig 获取全局配置(线程安全)
func GetConfig() *Config {
	return globalConfig
}